package com.bbva.itradecomex.controller.vistaBanco;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import com.bbva.itradecomex.bo.iface.RankingBancosBO;
import com.bbva.itradecomex.controller.ComunController;
import com.bbva.itradecomex.domain.BancoRankBancoResultado;
import com.bbva.itradecomex.domain.MultiTabla;
import com.bbva.itradecomex.form.RankingBancoBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;


@Controller
@RequestScoped
@ManagedBean
public class RankingBancosController {
	
	private static final Logger log = Logger.getLogger(RankingBancosController.class);
	
	@Autowired
	private RankingBancosBO rankingBancoBO;
	
	private List<BancoRankBancoResultado> listaBBancosResultadoImportaciones;
	private List<BancoRankBancoResultado> listaBBancosResultadoExportaciones;
	private List<BancoRankBancoResultado> listaBBancosResultadoImpoExpo;
	private MultiTabla exclusivBancoSeleccionado;
	private List<SelectItem> listExclusividadBanco;

	BancoRankBancoResultado totalBancoImp;
	BancoRankBancoResultado totalBancoExp;
	BancoRankBancoResultado totalBancoImpExp;
	
	RankingBancoBusquedaForm busquedaForm;
	
	Integer idxTabResult;

	public void onPageLoad(ComponentSystemEvent event) {
		try {
			if (!FacesContext.getCurrentInstance().isPostback()) {
				// Limpiar
				System.out.println("ingres a !isPostBack...");
				this.listaBBancosResultadoImportaciones = null;
				this.listaBBancosResultadoExportaciones = null;
				this.listaBBancosResultadoImpoExpo = null;
				this.totalBancoImp = null;
				this.totalBancoExp = null;
				this.totalBancoImpExp = null;
				this.exclusivBancoSeleccionado = null;
				this.listExclusividadBanco = null;
				this.busquedaForm = new RankingBancoBusquedaForm();
				
				Calendar cal = Calendar.getInstance();
				cal.set(Calendar.YEAR, cal.get(Calendar.YEAR));
				cal.set(Calendar.MONTH, 0);
				cal.set(Calendar.DAY_OF_MONTH, 1);
				busquedaForm.setDtFechaIni(cal.getTime());
				busquedaForm.setDtFechaFin(Calendar.getInstance().getTime());

				this.cargarDatos();
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	public void validaRangoFechas(DateSelectEvent event) { 
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
    }

	public void validateDateChange(AjaxBehaviorEvent event){
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
	}
	
	
	public void cargarDatos() throws Exception{
		ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
				.getBean("comunController");
		comunController.inicializarValores();
		comunController.cargarExclusividadAladi();
		comunController.cargarExclusividadBancos();
		comunController.cargarExclusividadBancosClave();
	}
	
	public String exportPDFRankingBancos(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoImportaciones(), this.getBusquedaForm(),this.getTotalBancoImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 1://EXPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoExportaciones(), this.getBusquedaForm(),this.getTotalBancoExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 2://IMPORTACIONES Y EXPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoImpoExpo(), this.getBusquedaForm(),this.getTotalBancoImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}
	public String exportXLSRankingBancos(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoImportaciones(), this.getBusquedaForm(),this.getTotalBancoImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 1://EXPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoExportaciones(), this.getBusquedaForm(),this.getTotalBancoExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 2://IMPORTACIONES Y EXPORTACIONES
					rankingBancoBO.generaPDFRankingBanco(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaBBancosResultadoImpoExpo(), this.getBusquedaForm(),this.getTotalBancoImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}
	

	public void buscarRankingBancos(ActionEvent event) {
		try {
			if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
						MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
						MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
				return;
			}
			ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("comunController");
			if(comunController.getPaisSeleccionado()!=null){
				this.getBusquedaForm().setStrCodPais(comunController.getPaisSeleccionado().getCodPais());
				this.getBusquedaForm().setStrDescPais(comunController.getPaisSeleccionado().getDescripcion());
			}
			if(comunController.getBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodBanco(comunController.getBancoSeleccionado().getCodBanco());
				this.getBusquedaForm().setStrDescBanco(comunController.getBancoSeleccionado().getDescBanco1());
			}
			if(comunController.getExclusivBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluGrupo(comunController.getExclusivBancoSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluGrupo(comunController.getExclusivBancoSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivBancoClaveSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluClave(comunController.getExclusivBancoClaveSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluClave(comunController.getExclusivBancoClaveSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivAladiSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluOpera(comunController.getExclusivAladiSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluOpera(comunController.getExclusivAladiSeleccionado().getDescripcion());
			}
			
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					this.setListaBBancosResultadoImportaciones(rankingBancoBO
							.getListRankingBancoImport(busquedaForm));
					// Importaciones
					totalBancoImp = new BancoRankBancoResultado("", "", "", "", "", "",
							"", new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0));
					rankingBancoBO.setearTotales(totalBancoImp,
							this.getListaBBancosResultadoImportaciones());
					break;
				case 1://EXPORTACIONES
					this.setListaBBancosResultadoExportaciones(rankingBancoBO
							.getListRankingBancoExport(busquedaForm));
					// Exportaciones				
					totalBancoExp = new BancoRankBancoResultado("", "", "", "", "", "",
							"", new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0));
					rankingBancoBO.setearTotales(totalBancoExp,
							this.getListaBBancosResultadoExportaciones());
					break;
				case 2://IMPORTACIONES Y EXPORTACIONES
					this.setListaBBancosResultadoImpoExpo(rankingBancoBO
							.getListRankingBancoImpExp(busquedaForm));
					// Importaciones-Exportaciones
					totalBancoImpExp = new BancoRankBancoResultado("", "", "", "", "", "",
							"", new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
							new BigDecimal(0));
					rankingBancoBO.setearTotales(totalBancoImpExp,
							this.getListaBBancosResultadoImpoExpo());
					break;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}	

	public BancoRankBancoResultado getTotalBancoImp() {
		return totalBancoImp;
	}

	public void setTotalBancoImp(BancoRankBancoResultado totalBancoImp) {
		this.totalBancoImp = totalBancoImp;
	}

	public BancoRankBancoResultado getTotalBancoExp() {
		return totalBancoExp;
	}

	public void setTotalBancoExp(BancoRankBancoResultado totalBancoExp) {
		this.totalBancoExp = totalBancoExp;
	}

	public BancoRankBancoResultado getTotalBancoImpExp() {
		return totalBancoImpExp;
	}

	public void setTotalBancoImpExp(BancoRankBancoResultado totalBancoImpExp) {
		this.totalBancoImpExp = totalBancoImpExp;
	}

	public List<BancoRankBancoResultado> getListaBBancosResultadoImportaciones() {
		return listaBBancosResultadoImportaciones;
	}

	public void setListaBBancosResultadoImportaciones(
			List<BancoRankBancoResultado> listaBBancosResultadoImportaciones) {
		this.listaBBancosResultadoImportaciones = listaBBancosResultadoImportaciones;
	}

	public List<BancoRankBancoResultado> getListaBBancosResultadoExportaciones() {
		return listaBBancosResultadoExportaciones;
	}

	public void setListaBBancosResultadoExportaciones(
			List<BancoRankBancoResultado> listaBBancosResultadoExportaciones) {
		this.listaBBancosResultadoExportaciones = listaBBancosResultadoExportaciones;
	}

	public List<BancoRankBancoResultado> getListaBBancosResultadoImpoExpo() {
		return listaBBancosResultadoImpoExpo;
	}

	public void setListaBBancosResultadoImpoExpo(
			List<BancoRankBancoResultado> listaBBancosResultadoImpoExpo) {
		this.listaBBancosResultadoImpoExpo = listaBBancosResultadoImpoExpo;
	}
	
	public RankingBancoBusquedaForm getBusquedaForm() {
		return busquedaForm;
	}

	public void setBusquedaForm(RankingBancoBusquedaForm busquedaForm) {
		this.busquedaForm = busquedaForm;
	}
	public Integer getIdxTabResult() {
		return idxTabResult;
	}
	public void setIdxTabResult(Integer idxTabResult) {
		this.idxTabResult = idxTabResult;
	}
	public MultiTabla getExclusivBancoSeleccionado() {
		return exclusivBancoSeleccionado;
	}
	public void setExclusivBancoSeleccionado(MultiTabla exclusivBancoSeleccionado) {
		this.exclusivBancoSeleccionado = exclusivBancoSeleccionado;
	}

	public List<SelectItem> getListExclusividadBanco() {
		return listExclusividadBanco;
	}

	public void setListExclusividadBanco(List<SelectItem> listExclusividadBanco) {
		this.listExclusividadBanco = listExclusividadBanco;
	}

	

}
